<?php
/**
 * Here is your custom functions.
 */

use think\facade\Cache;

if (!function_exists('asset')) {
    /**
     * Generate an asset path for the application.
     *
     * @param string $path
     * @param bool $secure
     * @return string
     */
    function asset($path, $secure = null)
    {
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https://' : 'http://';
        //$host = getenv('APP_HOST');
        $host = request()->host();
        $rootPath = '/';
        if (substr($path, 0, 1) == '/') {
            $url = $protocol . $host . $path;
        } else {
            $url = $protocol . $host . $rootPath . $path;
        }

        return $url;
    }
}

if (!function_exists('url')) {
    /**
     * 生成URL地址
     * @param string $url
     * @param array $vars
     * @param string $app
     * @return string
     */
    function url($url, $vars = [], $app = '')
    {
        $app = $app ?: request()->app;
        $vars = !empty($vars) ? '?' . http_build_query($vars) : '';

        return '/' . $app . $url . $vars;
    }
}

if (!function_exists('cookie')) {
    /**
     * Cookie管理
     */
    function cookie(string $name, $value = '', $option = null)
    {
        $request = request();
        if (is_null($value)) {
            // 删除

        } elseif ('' === $value) {
            // 获取
            $request->cookie($name);
        } else {
            // 设置
            $request->cookie($name, $value);
        }
    }
}

if (!function_exists('cache')) {
    /**
     * 缓存管理
     */
    function cache(string $name = null, $value = '', $options = null, $tag = null)
    {
        if (is_null($name)) {
            return '';
        }

        if ('' === $value) {
            // 获取缓存
            return 0 === strpos($name, '?') ? Cache::has(substr($name, 1)) : Cache::get($name);
        } elseif (is_null($value)) {
            // 删除缓存
            return Cache::delete($name);
        }

        // 缓存数据
        if (is_array($options)) {
            $expire = $options['expire'] ?? null; //修复查询缓存无法设置过期时间
        } else {
            $expire = $options;
        }

        if (is_null($tag)) {
            return Cache::set($name, $value, $expire);
        } else {
            return Cache::tag($tag)->set($name, $value, $expire);
        }
    }
}

if (!function_exists('__')) {
    /**
     * 获取语言变量值
     * @param string $name 语言变量名
     * @param array $vars 动态变量值
     * @param string $lang 语言
     * @return mixed
     */
    function __($name, $vars = [], $lang = '')
    {
        if (is_numeric($name) || !$name)
            return $name;
        if (!is_array($vars)) {
            $vars = func_get_args();
            array_shift($vars);
            $lang = '';
        }
        //return trans($name, $vars, $lang);
        return $name;
    }
}

/**
 * 判断是否SSL协议
 * @return boolean
 */
function is_ssl()
{
    if (isset($_SERVER['HTTPS']) && ('1' == $_SERVER['HTTPS'] || 'on' == strtolower($_SERVER['HTTPS']))) {
        return true;
    } elseif (isset($_SERVER['SERVER_PORT']) && ('443' == $_SERVER['SERVER_PORT'])) {
        return true;
    }

    return false;
}

/**
 * 获取客户端IP
 */
function get_IP()
{
//    $ip = request()->getRemoteIp();
    $ip = request()->getRealIp();

    return $ip;
}

/**
 * 格式化字节大小  (用于数据库备份)
 *
 * @param number $size 字节数
 * @param string $delimiter 数字和单位分隔符
 * @return string 格式化后的带单位的大小
 */
function format_bytes($size, $delimiter = '')
{
    $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB');
    for ($i = 0; $size >= 1024 && $i < 5; $i++) $size /= 1024;

    return round($size, 2) . $delimiter . $units[$i];
}

/**
 * 转化数据库保存的文件路径为可以访问的url
 *
 * @param string $filepath
 * @return string
 */
function full_file_url($filepath)
{
    if ($filepath) {
        if (strpos($filepath, 'http') === 0 || strpos($filepath, 'https') === 0) {
            return $filepath;
        } else {
            $fullFileUrl = asset(config('path.upload_path') . $filepath);

            return $fullFileUrl;
        }
    } else {
        return asset(config('path.static_path') . 'img/not_image.png');
    }
}

/**
 * 去掉数据库保存的文件路径中 http(s) 等前缀字符
 */
function unfull_file_url($files)
{
    $path = asset(config('path.upload_path'));
    if (is_array($files)) {
        foreach ($files as &$file) {
            if (strpos($file, $path) !== false) {
                $file = str_replace($path, '', $file);
            }
        }
    } else {
        if (strpos($files, $path) !== false) {
            $files = str_replace($path, '', $files);
        }
    }

    return $files;
}

function convert_number_to_str($number)
{
    return is_numeric($number) ? number_format($number, __('format.number.decimals'), __('format.number.dec_point'), __('format.number.thousands_sep')) : $number;
}

function convert_rate_to_str($number)
{
    return is_numeric($number) ? number_format($number, __('format.rate.decimals'), __('format.rate.dec_point'), __('format.rate.thousands_sep')) : $number;
}


// 生成唯一ID
function get_UUID($prefix = '')
{
    $uuid = md5(uniqid(mt_rand(), true));
    return $prefix . $uuid;
}

/**
 * 生成惟一单号
 * @return string
 */
function create_order_sn()
{
    return date('Ymd') . substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}

/**
 * 生成订单号
 */
function make_order_no()
{
    //$yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J');
    //$orderSn = $yCode[intval(date('Y')) - 2019] . strtoupper(dechex(date('m'))) . date('d') . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99));

    $orderSn = date('Ymd') . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99));

    return $orderSn;
}

/**
 * 生成随机数字验证码
 * @param int $len
 * @return bool|string
 */
function random_number($len = 6)
{
    $chars = str_repeat('0123456789', 3);
    // 位数过长重复字符串一定次数
    $chars = str_repeat($chars, $len);
    $chars = str_shuffle($chars);
    $str = substr($chars, 0, $len);

    return $str;
}

/**
 * 生成随机字符串生成
 * @param int $len 长度
 * @param string $type 字串类型：0 字母 1 数字 其它 混合
 * @return string
 */
function random_string($len = 6, $type = '')
{
    $str = '';
    switch ($type) {
        case 0:
            $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
            break;
        case 1:
            $chars = str_repeat('0123456789', 3);
            break;
        case 2:
            $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
            break;
        case 3:
            $chars = 'abcdefghijklmnopqrstuvwxyz';
            break;
        case 4:
            $chars = 'ABCDEFGHIJKMNPQRSTUVWXYZ23456789';
            break;
        case 5:
            $chars = 'abcdefghijkmnpqrstuvwxyz23456789';
            break;
        default :
            // 默认去掉了容易混淆的字符oOLl和数字01
            $chars = 'ABCDEFGHIJKMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789';
            break;
    }
    // 位数过长重复字符串一定次数
    if ($len > 10) {
        $chars = $type == 1 ? str_repeat($chars, $len) : str_repeat($chars, 5);
    }
    $chars = str_shuffle($chars);
    $str = substr($chars, 0, $len);

    /*
    $charsLen = strlen($chars);
    $str = '';
    for ($i = 0; $i < $len; $i++) {
        $str .= $chars[mt_rand(0, $charsLen - 1)];
    }
    */

    return $str;
}

/**
 * 验证数据格式
 * @param mixed $value 数据
 * @param mixed $type 类型
 * @return bool|string
 */
function verify_data($value, $type = 'require')
{
    $value = trim($value);

    switch ($type) {
        // 非空验证
        case 'require':
            return !!$value;
            break;
        // 汉字验证
        case 'ecode':
            return preg_match('/^[^\u4e00-\u9fa5]{0,}$/', $value);
            break;
        // 手机号验证
        case 'phone':
            return preg_match('/^1(3|4|5|6|7|8|9)[0-9]\d{8}$/', $value);
            break;
        // 手机号验证(包含座机)
        case 'phone1':
            $reg_mob = '/^1(3|4|5|6|7|8|9)[0-9]\d{8}$/';
            $reg_tel = '/^([0-9]{3,4}-)?[0-9]{7,8}$/';
            if (preg_match($reg_mob, $value) || preg_match($reg_tel, $value)) {
                return true;
            } else {
                return false;
            }
            break;
        // 邮箱验证
        case 'email':
            return preg_match('/^(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})$/', $value);
            break;
        // 验证非零的正整数
        case 'integer':
            return preg_match('/^\+?[1-9][0-9]*$/', $value);
            break;
        // 验证1-10的正数
        case 'number_1_10':
            return preg_match('/^([1-9]|10)\.?\d*$/', $value);
            break;
        // 验证正数
        case 'number':
            return preg_match('/^(([0-9]+[\.]?[0-9]+)|[1-9])$/', $value);
            break;
        // 验证金额
        case 'money':
            return preg_match('/^(([1-9]\d*)|\d)(\.\d{1,2})?$/', $value);
            break;
        default:
            return true;
            break;
    }
}

/**
 * 递归删除文件
 *
 * @param string $dir 文件夹路径
 * @param string /array $fileType 文件类型（.html/.php）
 */
function del_file($dir, $fileType = '')
{
    if (is_dir($dir)) {
        $files = scandir($dir);
        // 打开目录，列出目录中的所有文件并去掉 . 和 ..
        foreach ($files as $filename) {
            if ($filename != '.' && $filename != '..') {
                if (!is_dir($dir . '/' . $filename)) {
                    if (empty($fileType)) {
                        unlink($dir . '/' . $filename);
                    } else {
                        if (is_array($fileType)) {
                            // 正则匹配指定文件
                            if (preg_match($fileType[0], $filename)) {
                                unlink($dir . '/' . $filename);
                            }
                        } else {
                            // 指定包含某些字符串的文件
                            if (false != stristr($filename, $fileType)) {
                                unlink($dir . '/' . $filename);
                            }
                        }
                    }
                } else {
                    del_file($dir . '/' . $filename, $fileType);
                    rmdir($dir . '/' . $filename);
                }
            }
        }
    } else {
        if (file_exists($dir)) unlink($dir);
    }
}

/**
 * 数字转字母 （生成Excel列标）
 *
 * @param int $index 索引值
 * @param int $start 字母起始值
 * @return string 返回字母
 */
function intToChr($index, $start = 65)
{
    $str = '';
    if (floor($index / 26) > 0) {
        $str .= intToChr(floor($index / 26) - 1);
    }

    //echo intToChr(0); // A
    return $str . chr($index % 26 + $start);
}

/**
 * 截取指定两个字符之间字符串
 */
function get_between($input, $start, $end)
{
    $substr = substr($input, strlen($start) + strpos($input, $start), (strlen($input) - strpos($input, $end)) * (-1));

    return $substr;
}

/**
 * 把返回的数据集转换成Tree
 *
 * @param array $list 要转换的数据集
 * @param string $pk 主键字段
 * @param string $pid parent标记字段
 * @param string $child
 * @param int $root
 * @param bool $isChild
 * @return array
 */
function list_to_tree($list, $pk = 'id', $pid = 'parent_id', $child = 'children', $root = 0, $isChild = false)
{
    // 创建Tree
    $tree = [];
    if (is_array($list)) {
        // 创建基于主键的数组引用
        $refer = [];
        foreach ($list as $key => $item) {
            $refer[$item[$pk]] = &$list[$key];
        }
        foreach ($list as $key => $item) {
            // 判断是否存在parent
            $parentId = $item[$pid];
            if ($root === $parentId) {
                if ($isChild && !isset($list[$key][$child])) {
                    $list[$key][$child] = []; // 子集为空
                }
                $tree[] = &$list[$key];
            } else {
                if (isset($refer[$parentId])) {
                    $parent = &$refer[$parentId];
                    if ($isChild && !isset($list[$key][$child])) {
                        $list[$key][$child] = []; // 子集为空
                    }
                    $parent[$child][] = &$list[$key];
                }
            }
        }
    }

    return $tree;
}

/**
 * 二维数组按某个键判断是否重复去重
 */
function array_unique_fb($arr, $key = '')
{
    if (!$key) {
        return $arr;
    }
    $newArr = [];
    foreach ($arr as $value) {
        if (isset($newArr[$value[$key]])) {
            unset($value[$key]);
        } else {
            $newArr[$value[$key]] = $value;
        }
    }

    return $newArr;
}



/**
 * 自定义日志
 *
 * @param string $message 日志信息
 * @param string $level 日志级别
 * @param string $folder 文件夹
 */
function log_info($message, $level = 'INFO', $folder = 'default')
{
    $timezone = date_default_timezone_get();
    date_default_timezone_set('Asia/Shanghai');
    $path = root_path() . 'runtime/logs/' . $folder . '/' . date('Ym');
    if (!file_exists($path)) {
        mkdir($path, 0777, true);
    }
    $file = $path . '/' . date('d') . '.log';
    // 修改文件权限
    //chmod($file, 0777);
    $f = fopen($file, 'a+');
    $logInfo = "[" . date('Y-m-d H:i:s') . "]\r\n";
    $logInfo .= $level . ': ' . $message;
    fwrite($f, $logInfo . "\r\n\r\n");
    fclose($f);
    date_default_timezone_set($timezone);
}


/**
 * API接口输出数据
 */
function api_response($status, $msg = '', $data = [], $code = 200)
{
    $response = [
        'status' => $status,
        'msg' => $msg,
        'data' => $data,
        'code' => $code,
    ];

    return json($response);
}